home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / cross / GBDK-2.0.lha / GBDK / examples / dscan / dscan.c < prev    next >
C/C++ Source or Header  |  1998-11-26  |  21KB  |  750 lines

  1. /********************************************************************
  2.  * Color Deep Scan                                                  *
  3.  *  by                                                              *
  4.  * Mr. N.U. of TeamKNOx                                             *
  5.  ********************************************************************/
  6.  
  7. #include <gb.h>
  8. #include <stdlib.h>
  9. #include <rand.h>
  10.  
  11. /* bitmaps */
  12. #include "bkg.h"
  13. #include "bkg.c"
  14. #include "bkg_m.c"
  15. #include "bkg_c.c"
  16. #include "fore.h"
  17. #include "fore.c"
  18.  
  19. /* ************************************************************ */
  20.  
  21. UWORD bkg_p[] =
  22. {
  23.   bkgCGBPal7c0,bkgCGBPal7c1,bkgCGBPal7c2,bkgCGBPal7c3,
  24.   bkgCGBPal6c0,bkgCGBPal6c1,bkgCGBPal6c2,bkgCGBPal6c3,
  25.   bkgCGBPal5c0,bkgCGBPal5c1,bkgCGBPal5c2,bkgCGBPal5c3,
  26.   bkgCGBPal4c0,bkgCGBPal4c1,bkgCGBPal4c2,bkgCGBPal4c3,
  27.   bkgCGBPal3c0,bkgCGBPal3c1,bkgCGBPal3c2,bkgCGBPal3c3,
  28.   bkgCGBPal2c0,bkgCGBPal2c1,bkgCGBPal2c2,bkgCGBPal2c3,
  29.   bkgCGBPal1c0,bkgCGBPal1c1,bkgCGBPal1c2,bkgCGBPal1c3,
  30.   bkgCGBPal0c0,bkgCGBPal0c1,bkgCGBPal0c2,bkgCGBPal0c3
  31. };
  32.  
  33. UWORD obj_p[] =
  34. {
  35.   foreCGBPal7c0,foreCGBPal7c1,foreCGBPal7c2,foreCGBPal7c3,
  36.   foreCGBPal6c0,foreCGBPal6c1,foreCGBPal6c2,foreCGBPal6c3,
  37.   foreCGBPal5c0,foreCGBPal5c1,foreCGBPal5c2,foreCGBPal5c3,
  38.   foreCGBPal4c0,foreCGBPal4c1,foreCGBPal4c2,foreCGBPal4c3,
  39.   foreCGBPal3c0,foreCGBPal3c1,foreCGBPal3c2,foreCGBPal3c3,
  40.   foreCGBPal2c0,foreCGBPal2c1,foreCGBPal2c2,foreCGBPal2c3,
  41.   foreCGBPal1c0,foreCGBPal1c1,foreCGBPal1c2,foreCGBPal1c3,
  42.   foreCGBPal0c0,foreCGBPal0c1,foreCGBPal0c2,foreCGBPal0c3
  43. };
  44.  
  45. /* screen size */
  46. #define MIN_SX        5U        /* min x (char) */
  47. #define MAX_SX        (20U-MIN_SX)    /* max x (char) */
  48. #define MIN_SY        5U        /* min y (char) */
  49. #define MAX_SY        (MIN_SY+13U)    /* max y (char) */
  50.  
  51. #define DEF_SP        30U        /* sprite null char code */    
  52.  
  53. /* player */
  54. #define MIN_PX        (MIN_SX*8U+8U)    /* min x (dot) */
  55. #define MAX_PX        (MAX_SX*8U-8U)    /* max x (dot) */
  56. #define DEF_PX        80U        /* ship x pos (dot) */
  57. #define DEF_PY        (MIN_SY*8U)    /* ship y pos (dot) */
  58. #define DEF_PC0        14U
  59. #define DEF_PC1        15U
  60. #define DEF_PF        8U
  61.  
  62. /* bomb */
  63. #define MAX_TT        6U        /* number */
  64. #define DEF_TS        2U        /* sprite tile id */
  65. #define DEF_TC        2U        /* sprite data id */
  66. #define DEF_TX        (80U-6U)    /* bomb x pos (dot) */
  67. #define DEF_TY        (DEF_PY-14U)    /* bomb y pos (dot) */
  68. #define MAX_TY        (MAX_SY*8U)    /* max y pos (dot) */
  69.  
  70. /* enemy */
  71. #define MAX_ET        10U        /* number */
  72. #define DEF_ES0        (DEF_TS+MAX_TT) /* sprite tile id */
  73. #define DEF_ES1        (DEF_ES0+1U)
  74. #define DEF_1EC0    32U
  75. #define DEF_1EC1    48U
  76. #define DEF_2EC0    64U
  77. #define DEF_2EC1    80U
  78. #define DEF_XEC0    96U        /* sprite data(X) id */
  79. #define DEF_XEC1    112U        /* sprite data(X) id */
  80. #define DEF_EY        (DEF_PY+12U)
  81. #define DEF_EH        10U
  82. #define SUB_EX0        20U
  83. #define SUB_EX1        (SUB_EX0-8U)
  84. #define MIN_EX        (SUB_EX0-16U)
  85. #define MAX_EX        (SUB_EX0+180U)
  86. #define SPEED_EY    (DEF_EY+DEF_EH*3U)
  87. #define DEF_BC1        4U
  88. #define DEF_BC2        5U
  89.  
  90. /* kirai */
  91. #define MAX_KT        12U
  92. #define DEF_KS        (DEF_ES0+MAX_ET*2U)    /* sprite tile id */
  93. #define DEF_KC        4U        /* sprite data id */
  94. #define DEF_KX        0U        /* bomb x pos (default_dot) */
  95. #define DEF_KY        0U        /* bomb y pos (default_dot) */
  96. #define MIN_KY        (DEF_PY+1U)    /* min y pos (dot) */
  97.  
  98. unsigned char msg_tile[64];
  99.  
  100. unsigned char msg_1up[]   = "1UP";
  101. unsigned char msg_lv[]    = "LV";
  102.  
  103. unsigned char msg_gover[] = "GAMEOVER";
  104. unsigned char msg_pause[] = " PAUSE! ";
  105. unsigned char msg_start[] = "        ";
  106.  
  107. UBYTE pf, px, pp, pl;
  108. UWORD pw;
  109. UWORD ps;
  110. UBYTE tf[MAX_TT], tx[MAX_TT], ty[MAX_TT];
  111. UBYTE ef[MAX_ET], ex[MAX_ET], ey[MAX_ET];
  112. UBYTE kf[MAX_KT], kx[MAX_KT], ky[MAX_KT];
  113. UBYTE rnd_enemy, rnd_kirai;
  114. UBYTE k_right, k_left;
  115.  
  116. /* Seed for the random number generator */
  117. fixed seed;
  118.  
  119. void set_sprite_attrb( UBYTE nb, UBYTE tile )
  120. {
  121.   if( _cpu==0x11 ) {
  122.     set_sprite_prop( nb, tile );
  123.   }
  124. }
  125.  
  126.  
  127. void set_bkg_attr( UBYTE x, UBYTE y, UBYTE sx, UBYTE sy, unsigned char *d )
  128. {
  129.   UBYTE xx, yy;
  130.  
  131.   VBK_REG = 1;        /* select palette bank */
  132.   for( yy=0; yy<sy; yy++ ) {
  133.     for( xx=0; xx<sx; xx++ ) {
  134.       msg_tile[xx] = bkgCGB[(unsigned int)*d];
  135.       d++;
  136.     }
  137.     set_bkg_tiles( x, y+yy, sx, 1, msg_tile );
  138.   }
  139.   VBK_REG = 0;        /* select data bank */
  140. }
  141.  
  142. UBYTE make_rnd( UBYTE i )
  143. {
  144.   return( arand()%(i+1) );
  145. }
  146.  
  147. void show_score( UWORD s )
  148. {
  149.   UWORD m;
  150.   UBYTE i, n, f;
  151.   unsigned char score[6];
  152.  
  153.   f = 0; m = 10000;
  154.   for( i=0; i<5; i++ ) {
  155.     n = s/m; s = s%m; m = m/10;
  156.     if( (n==0)&&(f==0) ) {
  157.       score[i] = 0x20;      /* ' ' */
  158.     } else {
  159.       f = 1;
  160.       score[i] = 0x30+n;    /* '0' - '9' */
  161.     }
  162.   }
  163.   score[5] = 0x30;      /* '0' */
  164.   set_bkg_tiles( 4, 0, 6, 1, score );
  165. }
  166.  
  167. void set_level( UBYTE i )
  168. {
  169.   /* level */
  170.   if( i < 9 ) {
  171.     rnd_enemy = 100-(i*12); /*  1% - */
  172.     rnd_kirai = 50-(i*6);   /*  2% - */
  173.   } else {
  174.     rnd_enemy = 0;      /* 100 % */
  175.     rnd_kirai = 0;      /* 100 % */
  176.   }
  177. }
  178.  
  179. void show_level( UBYTE i )
  180. {
  181.   unsigned char level[2];
  182.  
  183.   if( i < 9 ) {
  184.     level[0] = 0x31+i;
  185.   } else {
  186.     level[0] = 0x41+i-9;
  187.   }
  188.   set_bkg_tiles( 19, 0, 1, 1, level );
  189.   set_level( i );
  190. }
  191.  
  192. void show_gover()
  193. {
  194.   set_bkg_tiles(  6, 9, 8, 1, msg_gover );
  195.   pf = DEF_PF;
  196. }
  197.  
  198. void show_pause()
  199. {
  200.   set_bkg_tiles(  6, 9, 8, 1, msg_pause );
  201. }
  202.  
  203. void hide_msg()
  204. {
  205.   set_bkg_tiles(  6, 9, 8, 1, msg_start );
  206. }
  207.  
  208. void init_score()
  209. {
  210.   ps = 0;
  211.   show_score( ps );
  212.   pp = 0; pl = 0;
  213.   show_level( pl );
  214. }
  215.  
  216. void init_screen()
  217. {
  218.   UBYTE n;
  219.  
  220.   if( _cpu==0x11 ) {
  221.     /* Transfer color palette */
  222.     set_bkg_palette( 0, 1, &bkg_p[0] );
  223.     set_bkg_palette( 1, 1, &bkg_p[4] );
  224.     set_bkg_palette( 2, 1, &bkg_p[8] );
  225.     set_bkg_palette( 3, 1, &bkg_p[12] );
  226.     set_bkg_palette( 4, 1, &bkg_p[16] );
  227.     set_bkg_palette( 5, 1, &bkg_p[20] );
  228.     set_bkg_palette( 6, 1, &bkg_p[24] );
  229.     set_bkg_palette( 7, 1, &bkg_p[28] );
  230.     set_sprite_palette( 0, 1, &obj_p[0] );
  231.     set_sprite_palette( 1, 1, &obj_p[4] );
  232.     set_sprite_palette( 2, 1, &obj_p[8] );
  233.     set_sprite_palette( 3, 1, &obj_p[12] );
  234.     set_sprite_palette( 4, 1, &obj_p[16] );
  235.     set_sprite_palette( 5, 1, &obj_p[20] );
  236.     set_sprite_palette( 6, 1, &obj_p[24] );
  237.     set_sprite_palette( 7, 1, &obj_p[28] );
  238.  
  239.     /* set attributes */
  240.     set_bkg_attr( 0, 0, 20, 18, bkg_c );
  241.     set_bkg_tiles(  0, 0, 20, 18, bkg_c );
  242.   } else {
  243.     set_bkg_tiles(  0, 0, 20, 18, bkg_m );
  244.   }
  245.  
  246.   pw = 50;
  247.   set_bkg_data(  0, 96, bkg );
  248.   set_bkg_tiles(  0, 0, 3, 1, msg_1up );
  249.   set_bkg_tiles( 16, 0, 2, 1, msg_lv );
  250.   SHOW_BKG;
  251.   SPRITES_8x8;
  252.   set_sprite_data( 0, 128, fore );
  253.   SHOW_SPRITES;
  254.   for( n=0; n<40; n++ ) {
  255.     set_sprite_tile( n, DEF_SP );
  256.     move_sprite( n, 0, 0 );
  257.   }
  258. }
  259.  
  260. void init_player()
  261. {
  262.   pf = 0; px = DEF_PX;
  263.   set_sprite_tile( 0, 0 );
  264.   set_sprite_attrb( 0, foreCGB[0] );
  265.   move_sprite( 0, px, DEF_PY );
  266.   set_sprite_tile( 1, 1 );
  267.   set_sprite_attrb( 1, foreCGB[1] );
  268.   move_sprite( 1, px+8, DEF_PY );
  269. }
  270.  
  271. void init_tama()
  272. {
  273.   UBYTE i;
  274.  
  275.   for( i=0; i<MAX_TT; i++ ) {
  276.     tf[i] = 0;
  277.     tx[i] = i*4+DEF_TX;
  278.     ty[i] = DEF_TY;
  279.     set_sprite_tile( i+DEF_TS, tf[i]+DEF_TC );
  280.     set_sprite_attrb( i+DEF_TS, foreCGB[tf[i]+DEF_TC] );
  281.     move_sprite( i+DEF_TS, tx[i], ty[i] );
  282.   }
  283. }
  284.  
  285. void init_enemy()
  286. {
  287.   UBYTE i;
  288.  
  289.   for( i=0; i<MAX_ET; i++ ) {
  290.     ef[i] = 0;
  291.     ex[i] = 0;
  292.     ey[i] = 0;
  293.     set_sprite_tile( i*2+DEF_ES0, DEF_SP );
  294.     set_sprite_tile( i*2+DEF_ES1, DEF_SP );
  295.     move_sprite( i*2+DEF_ES0, ex[i], ey[i] );
  296.     move_sprite( i*2+DEF_ES1, ex[i], ey[i] );
  297.   }
  298. }
  299.  
  300. void init_kirai()
  301. {
  302.   UBYTE i;
  303.  
  304.   for( i=0; i<MAX_KT; i++ ) {
  305.     kf[i] = 0;
  306.     kx[i] = DEF_KX;
  307.     ky[i] = DEF_KY;
  308.     set_sprite_tile( i+DEF_KS, DEF_SP );
  309.     move_sprite( i+DEF_KS, kx[i], ky[i] );
  310.   }
  311. }
  312.  
  313. /* player */
  314. void player()
  315. {
  316.   UBYTE key;
  317.   UBYTE i;
  318.  
  319.   key = joypad();
  320.   /* pause */
  321.   if( key & J_START ) {
  322.     if( pf == DEF_PF ) {
  323.       /* Initialize the random number generator */
  324.       seed.b.l = DIV_REG;
  325.       waitpadup();
  326.       seed.b.h = DIV_REG;
  327.       initarand(seed.w);
  328.       hide_msg();
  329.       init_score();
  330.       init_player();
  331.       init_tama();
  332.       init_enemy();
  333.       init_kirai();
  334.       delay( 500UL );
  335.     } else {
  336.       show_pause();
  337.       waitpadup();
  338.       key = joypad();
  339.       while( !(key & J_START) ) {
  340.         key = joypad();
  341.         if( key & J_DOWN ) {
  342.           if(pl > 0)
  343.             pl--;
  344.           show_level( pl );
  345.           waitpadup();
  346.         } else if( key & J_UP ) {
  347.           if(pl < 8)
  348.             pl++;
  349.           show_level( pl );
  350.           waitpadup();
  351.         } else if( key & J_LEFT ) {
  352.           while( joypad() & J_LEFT ) {
  353.             if(pw > 0)
  354.               pw--;
  355.             show_score( pw );
  356.             delay( 250UL );
  357.           }
  358.           show_score( ps );
  359.         } else if( key & J_RIGHT ) {
  360.           while( joypad() & J_RIGHT ) {
  361.             if(pw < 99)
  362.               pw++;
  363.             show_score( pw );
  364.             delay( 250UL );
  365.           }
  366.           show_score( ps );
  367.         } else if( key & J_SELECT ) {
  368.           i = k_right;
  369.           k_right = k_left;
  370.           k_left  = i;
  371.           waitpadup();
  372.         }
  373.       }
  374.       waitpadup();
  375.       hide_msg();
  376.       delay( 500UL );
  377.     }
  378.     return;
  379.   }
  380.  
  381.   /* dead */
  382.   if( pf > 1 ) {
  383.     if( pf < DEF_PF ) {
  384.       set_sprite_tile( 0, pf*2+DEF_PC0 );
  385.       set_sprite_attrb( 0, foreCGB[pf*2+DEF_PC0] );
  386.       set_sprite_tile( 1, pf*2+DEF_PC1 );
  387.       set_sprite_attrb( 1, foreCGB[pf*2+DEF_PC1] );
  388.       pf++;
  389.     } else {
  390.       set_sprite_tile( 0, DEF_SP );
  391.       set_sprite_tile( 1, DEF_SP );
  392.       show_gover();
  393.     }
  394.     return;
  395.   }
  396.  
  397.   /* move */
  398.   if( (key&J_LEFT)&&(px>MIN_PX) ) {
  399.     px--;
  400.     move_sprite( 0, px, DEF_PY ); move_sprite( 1, px+8, DEF_PY );
  401.   } else if( (key&J_RIGHT)&&(px<MAX_PX) ) {
  402.     px++;
  403.     move_sprite( 0, px, DEF_PY ); move_sprite( 1, px+8, DEF_PY );
  404.   }
  405.   /* shot */
  406.   if( key & k_left ) {  /* change J_B to J_A */
  407.     if( pf == 0 ) {
  408.       pf = 1;
  409.       for( i=0; i<MAX_TT; i++ ) {
  410.         if( tf[i] == 0 ) {
  411.           tf[i] = 1; tx[i] = px-4; ty[i] = DEF_PY;
  412.           break;
  413.         }
  414.       }
  415.     }
  416.   } else if( key & k_right ) {  /* change J_A to J_B */
  417.     if( pf == 0 ) {
  418.       pf = 1;
  419.       for( i=0; i<MAX_TT; i++ ) {
  420.         if( tf[i] == 0 ) {
  421.           tf[i] = 1; tx[i] = px+12; ty[i] = DEF_PY;
  422.           break;
  423.         }
  424.       }
  425.     }
  426.   } else if( pf == 1 ) {
  427.     pf = 0;
  428.   }
  429. }
  430.  
  431. /* bombs */
  432. void bombs()
  433. {
  434.   UBYTE i;
  435.  
  436.   for( i=0; i<MAX_TT; i++ ) {
  437.     if( tf[i] != 0 ) {
  438.       ty[i]++;
  439.       if( ty[i] > MAX_TY ) {
  440.         tf[i] = 0; tx[i] = i*4+DEF_TX; ty[i] = DEF_TY;
  441.       } else {
  442.         tf[i] = 3-tf[i];
  443.       }
  444.       set_sprite_tile( i+DEF_TS, tf[i]+DEF_TC );
  445.       set_sprite_attrb( i+DEF_TS, foreCGB[tf[i]+DEF_TC] );
  446.       move_sprite( i+DEF_TS, tx[i], ty[i] );
  447.     }
  448.   }
  449. }
  450.  
  451. /* enemys */
  452. void enemys()
  453. {
  454.   UBYTE i, j;
  455.  
  456.   for( i=0; i<MAX_ET; i++ ) {
  457.     if( ef[i] == 1 ) {
  458.       /* move right to left */
  459.       ex[i]--;
  460.       if( (pl>0)&&(ey[i]<SPEED_EY) )  ex[i]--;
  461.       if( ex[i] <= MIN_EX ) {
  462.         ef[i] = 0;
  463.         set_sprite_tile( i*2+DEF_ES0, DEF_SP );
  464.         set_sprite_tile( i*2+DEF_ES1, DEF_SP );
  465.       } else {
  466.         /* new */
  467.         if( ex[i]<MIN_SX*8+13 ) {
  468.           set_sprite_tile( i*2+DEF_ES0, DEF_1EC0 );
  469.           set_sprite_tile( i*2+DEF_ES1, DEF_1EC1 );
  470.         } else if( ex[i]<MIN_SX*8+20 ) {
  471.           set_sprite_tile( i*2+DEF_ES0, DEF_1EC0 );
  472.           set_sprite_tile( i*2+DEF_ES1, DEF_1EC1+(ex[i]-MIN_SX*8-13) );
  473.         } else if( ex[i]<MIN_SX*8+28 ) {
  474.           set_sprite_tile( i*2+DEF_ES0, DEF_1EC0+(ex[i]-MIN_SX*8-20) );
  475.           set_sprite_tile( i*2+DEF_ES1, DEF_1EC1+8 );
  476.         } else if( ex[i]<MAX_SX*8+13 ) {
  477.           set_sprite_tile( i*2+DEF_ES0, DEF_1EC0+8 );
  478.           set_sprite_tile( i*2+DEF_ES1, DEF_1EC1+8 );
  479.         } else if( ex[i]<MAX_SX*8+20 ) {
  480.           set_sprite_tile( i*2+DEF_ES0, DEF_1EC0+8 );
  481.           set_sprite_tile( i*2+DEF_ES1, DEF_1EC1+(ex[i]-MAX_SX*8-12)+7 );
  482.         } else if( ex[i]<MAX_SX*8+28 ) {
  483.           set_sprite_tile( i*2+DEF_ES0, DEF_1EC0+(ex[i]-MAX_SX*8-20)+8 );
  484.           set_sprite_tile( i*2+DEF_ES1, DEF_1EC1 );
  485.         } else {
  486.           set_sprite_tile( i*2+DEF_ES0, DEF_1EC0 );
  487.           set_sprite_tile( i*2+DEF_ES1, DEF_1EC1 );
  488.         }
  489.         /* new */
  490.         move_sprite( i*2+DEF_ES0, ex[i]-SUB_EX0, ey[i] );
  491.         move_sprite( i*2+DEF_ES1, ex[i]-SUB_EX1, ey[i] );
  492.         /* check bomb */
  493.         for( j=0; j<MAX_TT; j++ ) {
  494.           if( tf[j] != 0 ) {
  495.             if( (ty[j]>ey[i]-2)&&(ty[j]<ey[i]+2) ) {
  496.               if( (tx[j]>(ex[i]-SUB_EX0-5))&&(tx[j]<(ex[i]-SUB_EX1+5)) ) {
  497.                 /* hit */
  498.                 tf[j] = 0; tx[j] = j*4+DEF_TX; ty[j] = DEF_TY;
  499.                 set_sprite_tile( j+DEF_TS, tf[j]+DEF_TC );
  500.                 set_sprite_attrb( j+DEF_TS, foreCGB[tf[j]+DEF_TC] );
  501.                 move_sprite( j+DEF_TS, tx[j], ty[j] );
  502.                 ef[i] = 3;
  503.                 set_sprite_tile( i*2+DEF_ES0, ef[i]*2+DEF_BC1 );
  504.                 set_sprite_attrb( i*2+DEF_ES0, foreCGB[ef[i]*2+DEF_BC1] );
  505.                 set_sprite_tile( i*2+DEF_ES1, ef[i]*2+DEF_BC2 );
  506.                 set_sprite_attrb( i*2+DEF_ES1, foreCGB[ef[i]*2+DEF_BC2] );
  507.               }
  508.             }
  509.           }
  510.         }
  511.         if( make_rnd(rnd_kirai) == 0 ) {
  512.           if( ((ex[i]-SUB_EX0)>MIN_PX)&&((ex[i]-SUB_EX0)<MAX_PX) ) {
  513.             if( kf[i] == 0 ) {
  514.               /* shot kirai */
  515.               kf[i] = 1;
  516.               kx[i] = ex[i]-SUB_EX0+4;
  517.               ky[i] = ey[i]-4;
  518.             } else if( kf[i+1] == 0 ) {
  519.               /* shot kirai */
  520.               kf[i+1] = 1;
  521.               kx[i+1] = ex[i]-SUB_EX0+4;
  522.               ky[i+1] = ey[i]-4;
  523.             } else if( kf[i+2] == 0 ) {
  524.               /* shot kirai */
  525.               kf[i+2] = 1;
  526.               kx[i+2] = ex[i]-SUB_EX0+4;
  527.               ky[i+2] = ey[i]-4;
  528.             }
  529.           }
  530.         }
  531.       }
  532.     } else if( ef[i] == 2 ) {
  533.       /* move left to right */
  534.       ex[i]++;
  535.       if( (pl>0)&&(ey[i]<SPEED_EY) )  ex[i]++;
  536.       if( ex[i] >= MAX_EX ) {
  537.         ef[i] = 0;
  538.         set_sprite_tile( i*2+DEF_ES0, DEF_SP );
  539.         set_sprite_tile( i*2+DEF_ES1, DEF_SP );
  540.       } else {
  541.         /* new */
  542.         if( i==9 ) {
  543.           if( ex[i]<MIN_SX*8+13 ) {
  544.             set_sprite_tile( i*2+DEF_ES0, DEF_XEC0 );
  545.             set_sprite_tile( i*2+DEF_ES1, DEF_XEC1 );
  546.           } else if( ex[i]<MIN_SX*8+20 ) {
  547.             set_sprite_tile( i*2+DEF_ES0, DEF_XEC0 );
  548.             set_sprite_tile( i*2+DEF_ES1, DEF_XEC1+(ex[i]-MIN_SX*8-13) );
  549.           } else if( ex[i]<MIN_SX*8+28 ) {
  550.             set_sprite_tile( i*2+DEF_ES0, DEF_XEC0+(ex[i]-MIN_SX*8-20) );
  551.             set_sprite_tile( i*2+DEF_ES1, DEF_XEC1+8 );
  552.           } else if( ex[i]<MAX_SX*8+13 ) {
  553.             set_sprite_tile( i*2+DEF_ES0, DEF_XEC0+8 );
  554.             set_sprite_tile( i*2+DEF_ES1, DEF_XEC1+8 );
  555.           } else if( ex[i]<MAX_SX*8+20 ) {
  556.             set_sprite_tile( i*2+DEF_ES0, DEF_XEC0+8 );
  557.             set_sprite_tile( i*2+DEF_ES1, DEF_XEC1+(ex[i]-MAX_SX*8-12)+7 );
  558.           } else if( ex[i]<MAX_SX*8+28 ) {
  559.             set_sprite_tile( i*2+DEF_ES0, DEF_XEC0+(ex[i]-MAX_SX*8-20)+8 );
  560.             set_sprite_tile( i*2+DEF_ES1, DEF_XEC1 );
  561.           } else {
  562.             set_sprite_tile( i*2+DEF_ES0, DEF_XEC0 );
  563.             set_sprite_tile( i*2+DEF_ES1, DEF_XEC1 );
  564.           }
  565.         } else {
  566.           if( ex[i]<MIN_SX*8+13 ) {
  567.             set_sprite_tile( i*2+DEF_ES0, DEF_2EC0 );
  568.             set_sprite_tile( i*2+DEF_ES1, DEF_2EC1 );
  569.           } else if( ex[i]<MIN_SX*8+20 ) {
  570.             set_sprite_tile( i*2+DEF_ES0, DEF_2EC0 );
  571.             set_sprite_tile( i*2+DEF_ES1, DEF_2EC1+(ex[i]-MIN_SX*8-13) );
  572.           } else if( ex[i]<MIN_SX*8+28 ) {
  573.             set_sprite_tile( i*2+DEF_ES0, DEF_2EC0+(ex[i]-MIN_SX*8-20) );
  574.             set_sprite_tile( i*2+DEF_ES1, DEF_2EC1+8 );
  575.           } else if( ex[i]<MAX_SX*8+13 ) {
  576.             set_sprite_tile( i*2+DEF_ES0, DEF_2EC0+8 );
  577.             set_sprite_tile( i*2+DEF_ES1, DEF_2EC1+8 );
  578.           } else if( ex[i]<MAX_SX*8+20 ) {
  579.             set_sprite_tile( i*2+DEF_ES0, DEF_2EC0+8 );
  580.             set_sprite_tile( i*2+DEF_ES1, DEF_2EC1+(ex[i]-MAX_SX*8-12)+7 );
  581.           } else if( ex[i]<MAX_SX*8+28 ) {
  582.             set_sprite_tile( i*2+DEF_ES0, DEF_2EC0+(ex[i]-MAX_SX*8-20)+8 );
  583.             set_sprite_tile( i*2+DEF_ES1, DEF_2EC1 );
  584.           } else {
  585.             set_sprite_tile( i*2+DEF_ES0, DEF_2EC0 );
  586.             set_sprite_tile( i*2+DEF_ES1, DEF_2EC1 );
  587.           }
  588.         }
  589.         /* new */
  590.         move_sprite( i*2+DEF_ES0, ex[i]-SUB_EX0, ey[i] );
  591.         move_sprite( i*2+DEF_ES1, ex[i]-SUB_EX1, ey[i] );
  592.         /* check bomb */
  593.         for( j=0; j<MAX_TT; j++ ) {
  594.           if( tf[j] != 0 ) {
  595.             if( (ty[j]>ey[i]-2)&&(ty[j]<ey[i]+2) ) {
  596.               if( (tx[j]>(ex[i]-SUB_EX0-5))&&(tx[j]<(ex[i]-SUB_EX1+5)) ) {
  597.                 /* hit */
  598.                 tf[j] = 0; tx[j] = j*4+DEF_TX; ty[j] = DEF_TY;
  599.                 set_sprite_tile( j+DEF_TS, tf[j]+DEF_TC );
  600.                 set_sprite_attrb( j+DEF_TS, foreCGB[tf[j]+DEF_TC] );
  601.                 move_sprite( j+DEF_TS, tx[j], ty[j] );
  602.                 ef[i] = 3;
  603.                 set_sprite_tile( i*2+DEF_ES0, ef[i]*2+DEF_BC1 );
  604.                 set_sprite_attrb( i*2+DEF_ES0, foreCGB[ef[i]*2+DEF_BC1] );
  605.                 set_sprite_tile( i*2+DEF_ES1, ef[i]*2+DEF_BC2 );
  606.                 set_sprite_attrb( i*2+DEF_ES1, foreCGB[ef[i]*2+DEF_BC2] );
  607.               }
  608.             }
  609.           }
  610.         }
  611.         if( make_rnd(rnd_kirai) == 0 ) {
  612.           if( ((ex[i]-SUB_EX0)>MIN_PX)&&((ex[i]-SUB_EX0)<MAX_PX) ) {
  613.             if( kf[i] == 0 ) {
  614.               /* shot kirai */
  615.               kf[i] = 1;
  616.               kx[i] = ex[i]-SUB_EX0+4;
  617.               ky[i] = ey[i]-4;
  618.             } else if( kf[i+1] == 0 ) {
  619.               /* shot kirai */
  620.               kf[i+1] = 1;
  621.               kx[i+1] = ex[i]-SUB_EX0+4;
  622.               ky[i+1] = ey[i]-4;
  623.             } else if( kf[i+2] == 0 ) {
  624.               /* shot kirai */
  625.               kf[i+2] = 1;
  626.               kx[i+2] = ex[i]-SUB_EX0+4;
  627.               ky[i+2] = ey[i]-4;
  628.             }
  629.           }
  630.         }
  631.       }
  632.     } else if( ef[i] >= 3 ) {
  633.       if( ef[i] > 4 ) {
  634.         ef[i] = 0;
  635.         set_sprite_tile( i*2+DEF_ES0, DEF_SP );
  636.         set_sprite_tile( i*2+DEF_ES1, DEF_SP );
  637.         if( i == 9 ) {
  638.           ps += 100; show_score( ps ); pp++;
  639.           set_level( pl-1 );
  640.         } else {
  641.           ps += (i+1); show_score( ps ); pp++;
  642.         }
  643.       } else {
  644.         set_sprite_tile( i*2+DEF_ES0, ef[i]*2+DEF_BC1 );
  645.         set_sprite_attrb( i*2+DEF_ES0, foreCGB[ef[i]*2+DEF_BC1] );
  646.         set_sprite_tile( i*2+DEF_ES1, ef[i]*2+DEF_BC2 );
  647.         set_sprite_attrb( i*2+DEF_ES1, foreCGB[ef[i]*2+DEF_BC2] );
  648.         ef[i]++;
  649.       }
  650.     } else if( i == 9 ) {
  651.       if( pp > 20 ) {
  652.         pp = 0;
  653.         pl++; show_level( pl );
  654.         /* X */
  655.         ey[i] = i*DEF_EH+DEF_EY;
  656.         ef[i] = i%2+1;
  657.         ex[i] = MIN_EX;
  658.         set_sprite_tile( i*2+DEF_ES0, DEF_XEC0 );
  659.         set_sprite_attrb( i*2+DEF_ES0, foreCGB[DEF_XEC0] );
  660.         set_sprite_tile( i*2+DEF_ES1, DEF_XEC1 );
  661.         set_sprite_attrb( i*2+DEF_ES1, foreCGB[DEF_XEC1] );
  662.         move_sprite( i*2+DEF_ES0, ex[i]-SUB_EX0, ey[i] );
  663.         move_sprite( i*2+DEF_ES1, ex[i]-SUB_EX1, ey[i] );
  664.       }
  665.     } else if( make_rnd(rnd_enemy) == 0 ) {
  666.       if( !((pl<4)&&(i==0)) ) {
  667.         /* create */
  668.         ey[i] = i*DEF_EH+DEF_EY;
  669.         ef[i] = i%2+1;
  670.         if( ef[i] == 1 ) {
  671.           ex[i] = MAX_EX;
  672.           set_sprite_tile( i*2+DEF_ES0, DEF_1EC0 );
  673.           set_sprite_attrb( i*2+DEF_ES0, foreCGB[DEF_1EC0] );
  674.           set_sprite_tile( i*2+DEF_ES1, DEF_1EC1 );
  675.           set_sprite_attrb( i*2+DEF_ES1, foreCGB[DEF_1EC1] );
  676.         } else {
  677.           ex[i] = MIN_EX;
  678.           set_sprite_tile( i*2+DEF_ES0, DEF_2EC0 );
  679.           set_sprite_attrb( i*2+DEF_ES0, foreCGB[DEF_2EC0] );
  680.           set_sprite_tile( i*2+DEF_ES1, DEF_2EC1 );
  681.           set_sprite_attrb( i*2+DEF_ES1, foreCGB[DEF_2EC1] );
  682.         }
  683.         move_sprite( i*2+DEF_ES0, ex[i]-SUB_EX0, ey[i] );
  684.         move_sprite( i*2+DEF_ES1, ex[i]-SUB_EX1, ey[i] );
  685.       }
  686.     }
  687.   }
  688. }
  689.  
  690. /* kirai */
  691. void kirai()
  692. {
  693.   UBYTE i;
  694.  
  695.   for( i=0; i<MAX_KT; i++ ) {
  696.     if( kf[i] != 0 ) {
  697.       ky[i]--;
  698.       if( kf[i] >=3 ) {
  699.         kf[i]++;
  700.         if( (kx[i]>(px-5))&&(kx[i]<(px+12)) ) {
  701.           if( pf < 2 ) {
  702.             /* out!! */
  703.             pf = 2;
  704.           }
  705.         }
  706.         if( kf[i] >= 6 ) {
  707.           kf[i] = 0; kx[i] = DEF_KX; ky[i] = DEF_KY;
  708.         }
  709.       } else if( ky[i] <= MIN_KY ) {
  710.         kf[i] = 3;
  711.       } else {
  712.         kf[i] = 3-kf[i];
  713.       }
  714.       set_sprite_tile( i+DEF_KS, kf[i]+DEF_KC );
  715.       set_sprite_attrb( i+DEF_KS, foreCGB[kf[i]+DEF_KC] );
  716.       move_sprite( i+DEF_KS, kx[i], ky[i] );
  717.     }
  718.   }
  719. }
  720.  
  721. /*--------------------------------------------------------------------------*
  722.  | main program                                                             |
  723.  *--------------------------------------------------------------------------*/
  724. void main()
  725. {
  726.   disable_interrupts();
  727.   DISPLAY_OFF;
  728.  
  729.   initarand(seed.w);
  730.   init_screen();
  731.   init_score();
  732.   init_player();
  733.   init_tama();
  734.   init_enemy();
  735.   init_kirai();
  736.   show_gover();
  737.   k_right = J_A;
  738.   k_left = J_B;
  739.   DISPLAY_ON;
  740.   enable_interrupts();
  741.  
  742.   while(1) {
  743.     delay( pw );
  744.     player();
  745.     bombs();
  746.     enemys();
  747.     kirai();
  748.   }
  749. }
  750.